/*
 * @FileName: aiko_bus_transport.h
 * @Author: GreyQiu qiushaogui@aikosolar.com
 * @Date: 2023-08-21 16:44:51
 * @LastEditors: GreyQiu qiushaogui@aikosolar.com
 * @LastEditTime: 2023-09-13 09:03:57
 * @Description: 
 * 
 * Copyright (c) 2023, All Rights Reserved. 
 */

#ifndef __AIKO_BUS_H__
#define __AIKO_BUS_H__

#include <stdint.h>
#include <stdbool.h>

//  帧头帧尾
#define FRAME_HEADER    0x7E
#define FRAME_TAIL      0x7E

#define FRAME_HEAD_LEN      6
// 各字段位置定义
#define MSG_FRM_NUM_H_IDX       1   // 帧序号高8位
#define MSG_FRM_NUM_L_IDX       2   // 帧序号低8位
#define MSG_CMD_IDX             3   // 命令码
#define MSG_OPRATION_IDX        4   // 操作码
#define MSG_DATA_LEN_H_IDX      5   // 数据长度高8位
#define MSG_DATA_LEN_L_IDX      6   // 数据长度低8位
#define MSG_DATE_IDX            7   // 数据

// 操作码
#define OPERATE_R       0x01   // 读
#define OPERATE_W       0x02   // 写

// 操作结果
#define ERROR_NONE          0   // 无异常
#define ERROR_PERMISSION    1   // 无权限
#define ERROR_DATA          2   // 数据异常
#define ERROR_DATA_LEN      3   // 长度异常
#define ERROR_CRC           4   // 校验错误
#define ERROR_FAIL          5   // 操作失败 内部错误导致

#define ACK_SUCCESS         0
#define ACK_ERROR           1

// 读写权限
#define PERMISSION_R      1   // 只读
#define PERMISSION_W      2   // 只写
#define PERMISSION_RW     3   // 可读写

typedef struct
{
    uint8_t cmd;    // 命令码
    uint8_t permission; // 读写权限
    uint16_t len; // 可读写的长度
    void (*handler)(uint8_t cmd, uint8_t * buf, uint16_t len, uint8_t rw);
} cmd_obj_t;

void aiko_bus_ack_data(uint8_t cmd, uint8_t * data, uint16_t len);
void aiko_bus_ack_err(uint8_t cmd, uint8_t err_code);
void aiko_bus_transport(uint8_t * buffer, uint32_t len, cmd_obj_t * cmd_tbl, uint16_t tbl_len);
unsigned short CRC16(unsigned char *puchMsg, unsigned short usDataLen);

#endif // __AIKO_BUS_H__
